package oss

import (
	"encoding/base64"
	"fmt"
	"github.com/gin-gonic/gin"
	"myai/core/types"
	"myai/utils"
	"net/url"
	"os"
	"path/filepath"
	"strings"
)

type LocalStorage struct {
	config   *types.LocalStorageConfig
	proxyURL string
}

func NewLocalStorage(config *types.AppConfig) *LocalStorage {
	return &LocalStorage{config: &config.OSS.Local, proxyURL: config.ProxyURL}
}

// PutFile 把文件上传到本地
func (s *LocalStorage) PutFile(ctx *gin.Context, name string) (File, error) {
	// FormFile 接收客户端通过 multipart/form-data 格式提交的文件数据
	file, err := ctx.FormFile(name)
	if err != nil {
		return File{}, fmt.Errorf("从表单中获取文件出错：%v", err)
	}
	// 生成文件上传路径
	path, err := utils.GenUploadPath(s.config.BasePath, file.Filename, false)
	if err != nil {
		return File{}, fmt.Errorf("生成文件上传路径失败：%v", err)
	}
	// 保存文件到指定位置
	err = ctx.SaveUploadedFile(file, path)
	if err != nil {
		return File{}, fmt.Errorf("上传文件出错：%v", err)
	}
	// 获取文件扩展名
	ext := filepath.Ext(file.Filename)
	return File{
		Name:   file.Filename,
		ObjKey: path,
		Size:   file.Size,
		URL:    utils.GenUploadUrl(s.config.BasePath, s.config.BaseURL, path),
		Ext:    ext,
	}, nil
}

// PutUrlFile 通过 URL 下载文件到指定位置
func (s *LocalStorage) PutUrlFile(fileURL string, useProxy bool) (string, error) {
	parse, err := url.Parse(fileURL)
	if err != nil {
		return "", fmt.Errorf("解析图片地址出错：%v", err)
	}
	// 获取文件名称
	filename := filepath.Base(parse.Path)
	// 生成文件上传路径
	filePath, err := utils.GenUploadPath(s.config.BasePath, filename, true)
	if err != nil {
		return "", fmt.Errorf("生成上传图片地址出错：%v", err)
	}
	// 下载文件到指定位置
	if useProxy {
		err = utils.DownloadFile(fileURL, filePath, s.proxyURL)
	} else {
		err = utils.DownloadFile(fileURL, filePath, "")
	}
	if err != nil {
		return "", fmt.Errorf("下载图片出错：%v", err)
	}
	// 返回文件访问地址
	return utils.GenUploadUrl(s.config.BasePath, s.config.BaseURL, filePath), nil
}

// PutBase64 把base64数据解码，然后写入到文件中
func (s *LocalStorage) PutBase64(base64Img string) (string, error) {
	// 解码图片数据
	imageData, err := base64.StdEncoding.DecodeString(base64Img)
	if err != nil {
		return "", fmt.Errorf("解码图片数据出错：%v", err)
	}
	// 获取图片上传地址
	filePath, err := utils.GenUploadPath(s.config.BasePath, "", true)
	// 写入文件
	err = os.WriteFile(filePath, imageData, 0644)
	if err != nil {
		return "", fmt.Errorf("写入文件出错：%v", err)
	}
	// 返回文件访问地址
	return utils.GenUploadUrl(s.config.BasePath, s.config.BaseURL, filePath), nil
}

// Delete 删除文件
func (s *LocalStorage) Delete(fileURL string) error {
	// 判断文件是否存在，如果存在直接删除
	if _, err := os.Stat(fileURL); err == nil {
		return os.Remove(fileURL)
	}
	// 把 fileURL 中的 BaseURL 替换为 BasePath
	filePath := strings.Replace(fileURL, s.config.BaseURL, s.config.BasePath, 1)
	// 删除文件
	return os.Remove(filePath)
}

var _ Uploader = &LocalStorage{}
